package 多线程.虚假唤醒;

import lombok.SneakyThrows;

import java.util.concurrent.locks.LockSupport;

/**
 * 一个被唤醒的线程就处于就绪状态了，就可以等待被cpu调度了，
 *
 * 如果用if判断的话，唤醒后线程会从wait之后的代码开始运行，但是不会重新判断if条件，直接继续运行if代码块之后的代码.
 * 而使用while虽然也会从wait之后的代码开始运行，但是唤醒后会重新判断循环条件，如果不成立再执行while代码块之后的代码块，成立的话继续wait。
 * 所以必须用while来检查，这样可以保证每次被唤醒都会检查一次条件。
 */
public class ThreadTest01 {
    @SneakyThrows
    public static void main(String[] args) {
        // new 一个业务类
        MyService myService = new MyService();
        // 补货线程
        PlusThread plusThread = new PlusThread(myService);
        // 售货线程
        PlusThread.SubThread subThread = new PlusThread.SubThread(myService);
        
        // 然后一个补货 , 一个售货 
        Thread p = new Thread(plusThread);
        p.setName("P1");
        p.start();
        Thread s = new Thread(subThread);
        s.setName("S1");
        s.start();
//        这样执行得到的结果是正常的 , 暂时也看不出问题 , 可是当我们在此基础之上 , 将售货的线程再增加一个 , 问题就暴露出来了 ,
//        main方法中追加一下代码 , 再去执行看下效果
        Thread s2 = new Thread(subThread);
        s2.setName("S2");
        s2.start();
    }
}